import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

public class TestDemo2 {

    //扩容
    public static void main6(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();//初始的大小是0
        list1.add("haha!");//当第一次存放数据元素的时候，顺序表被分配大小为10，之后以1.5倍来扩容
        System.out.println(list1);
    }

    //ArrayList基本方法使用
    public static void main5(String[] args) {
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("a");
        list2.add("c");
        list2.add("g");
        list2.add("a");
        list2.add("o");
        List<String> sub = list2.subList(1,3);//左闭右开
        System.out.println(sub);
        System.out.println(list2);
        System.out.println("==================");
        sub.set(0,"p");
        System.out.println(sub);
        System.out.println(list2);//sub改了也会改变原集合的值

        System.out.println(list2);
        System.out.println(list2.lastIndexOf("c"));

        String ret = list2.set(2,"gaobo");
        System.out.println("原来的字符串"+ret);
        System.out.println(list2);
        list2.add(0,"gaobo");
        System.out.println(list2);

        ArrayList<String> list3 = new ArrayList<>();
        list3.add("我是测试List1");
        list3.add("我是测试List2");
        list3.add("我是测试List3");
        list2.addAll(list3);
        System.out.println(list2);

    }

    //迭代器add的注意点
    public static void main4(String[] args) {
        ArrayList<String> list2 = new ArrayList<>();//不是线程安全的
        //CopyOnWriteArrayList<String> list2 = new CopyOnWriteArrayList<>();//这样线程安全
        list2.add("hello");
        list2.add("bit");
        list2.add("haha");

        //Iterator没有add方法，这里用list迭代器
        ListIterator<String> it2 = list2.listIterator();
        while (it2.hasNext()) {
            String ret = it2.next();
            if(ret.equals("bit")) {
                it2.add("gaobo");
                //list2.add("gaobo");这样会报错，因为ArrayList不是线程安全的
            }else {
                System.out.print(ret + " ");
            }
        }
        System.out.println();
        System.out.println(list2);
    }

    //迭代器remove的注意点
    public static void main3(String[] args) {
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("hello");
        list2.add("bit");
        list2.add("haha");

        Iterator<String> it = list2.iterator();
        while (it.hasNext()) {
            String ret = it.next();
            if (ret.equals("hello")) {
                it.remove();//首先需要使用next方法迭代出集合中的元素 ，然后才能调用remove方法
            } else {
                System.out.print(ret + " ");
            }
        }
    }

    //ArrayList打印的几种方法
    public static void main2(String[] args) {
        //toString
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("hello");
        list2.add("bit");
        list2.add("haha");
        System.out.println(list2);

        //for循环
        System.out.println("================");
        for(int i = 0; i< list2.size();i++) {
            System.out.print(list2.get(i)+" ");
        }
        System.out.println();

        //foreach循环
        System.out.println("==================");
        for (String s : list2) {
            System.out.print(s+" ");
        }
        System.out.println();

        //迭代器
        System.out.println("========迭代器打印==========");
        Iterator<String> it = list2.iterator();
        while (it.hasNext()) {
            System.out.print(it.next()+" ");
        }

        //List迭代器
        System.out.println();
        System.out.println("========迭代器List相关打印==========");
        ListIterator<String> it2 = list2.listIterator();
        while (it2.hasNext()) {
            System.out.print(it2.next()+" ");
        }
    }

    public static void main1(String[] args) {

        List<String> list = new ArrayList<>(20);

        ArrayList<String> list2 = new ArrayList<>();
        list2.add("hello");
        list2.add("bit");
        list2.add("haha");
        System.out.println(list2);

        //使用另外一个ArrayList对list3进行初始化
        ArrayList<String> list3 = new ArrayList<>(list2);

    }

}